package com.saianfu.flowable.demo.common

import org.flowable.task.api.Task
import org.flowable.task.api.TaskQuery
import org.flowable.task.api.history.HistoricTaskInstance
import org.flowable.task.api.history.HistoricTaskInstanceQuery

/**
 * 流程任务查询相关封装
 */
interface ActTaskQuery {
    /**
     * 创建流程任务查询对象
     *
     * @return TaskQuery  流程查询对象.
     */
    fun createTaskQuery(): TaskQuery?

    /**
     * 查询任务变量值
     *
     * @param taskId       流程任务ID.
     * @param variableName 流程变量name.
     * @return String  流程变量Value.
     */
    fun findVariableByTaskId(taskId: String, variableName: String): String?

    /**
     * 查询任务业务主键
     *
     * @param taskId 流程任务ID.
     * @return String  业务主键.
     */
    fun findBusinessKeyByTaskId(taskId: String): String?

    /**
     * 创建历史任务查询对象
     *
     * @return HistoricTaskInstanceQuery
     */
    fun createHistoricTaskInstanceQuery(): HistoricTaskInstanceQuery?

    /**
     * 执行流程任务
     *
     * @param taskId 流程任务ID.
     * @return Task  流程任务.
     */
    fun taskId(taskId: String): Task?

    /**
     * 查询活动的流程任务
     *
     * @param processInstanceId 流程实例ID.
     * @return Task  流程任务.
     */
    fun processInstanceId(processInstanceId: String): Task?

    /**
     * 通过用户标识(任务候选人)，分页查询任务列表
     *
     * @param userId 用户标识.
     * @param start
     * @param limit
     * @return List<Task>  流程任务列表.
    </Task> */
    fun taskCandidateUser(userId: String, start: Int, limit: Int): List<Task>

    /**
     * 通过用户标识(实际参与者)，分页查询任务列表
     *
     * @param userId 用户标识.
     * @param start
     * @param limit
     * @return List<Task>  流程任务列表.
    </Task> */
    fun taskAssignee(userId: String, start: Int, limit: Int): List<Task>

    /**
     * 通过用户标识(实际参与者、或候选人)，分页查询任务列表
     *
     * @param userId 用户标识.
     * @param start
     * @param limit
     * @return List<Task>  流程任务列表.
    </Task> */
    fun taskCandidateOrAssigned(userId: String, start: Int, limit: Int): List<Task>

    /**
     * 通过用户标识(或候选人)，分页查询任务列表
     *
     * @param userId    用户标识.
     * @param variables 查询条件map.
     * @param start
     * @param limit
     * @return List<Task>  分页流程任务列表.
    </Task> */
    fun taskCandidateUserByCondition(userId: String, variables: Map<String, Any?>, start: Int, limit: Int): List<Task>

    /**
     * 通过用户标识(实际参与者)，分页查询任务列表
     *
     * @param userId    用户标识.
     * @param variables 查询条件map.
     * @param start
     * @param limit
     * @return List<Task>  分页流程任务列表.
    </Task> */
    fun taskAssigneeByCondition(userId: String, variables: Map<String, Any?>, start: Int, limit: Int): List<Task>

    /**
     * 通过用户标识(实际参与者、或候选人)，分页查询任务列表
     *
     * @param userId    用户标识.
     * @param variables 查询条件map.
     * @param start
     * @param limit
     * @return List<Task>  分页流程任务列表.
    </Task> */
    fun taskCandidateOrAssignedByCondition(userId: String, variables: Map<String, Any?>, start: Int, limit: Int): List<Task>

    /**
     * 通过用户标识(候选人)，统计活动任务数目
     *
     * @param userId 用户标识.
     * @return 活动任务数量.
     */
    fun countTaskCandidateUser(userId: String): Long

    /**
     * 通过用户标识(实际参与者)，统计活动任务数目
     *
     * @param userId 用户标识.
     * @return 活动任务数量.
     */
    fun countTaskAssignee(userId: String): Long

    /**
     * 通过用户标识(实际参与者、或候选人)，统计活动任务数目（用户参与的）
     *
     * @param userId 用户标识.
     * @return 活动任务数量.
     */
    fun countTaskCandidateOrAssigned(userId: String): Long

    /**
     * 通过用户标识(候选人)及查询条件map，统计活动任务数目（用户参与的）
     *
     * @param userId    用户标识.
     * @param variables 查询条件map.
     * @return 活动任务数量.
     */
    fun countTaskCandidateUserByCondition(userId: String, variables: Map<String, Any?>): Long

    /**
     * 通过用户标识(实际参与者)及查询条件map，统计活动任务数目（用户参与的）
     *
     * @param userId    用户标识.
     * @param variables 查询条件map.
     * @return 活动任务数量.
     */
    fun countTaskAssigneeByCondition(userId: String, variables: Map<String, Any?>): Long

    /**
     * 通过用户标识(实际参与者、候选人)及查询条件map，统计活动任务数目（用户参与的）
     *
     * @param userId    用户标识.
     * @param variables 查询条件map.
     * @return 活动任务数量.
     */
    fun countTaskCandidateOrAssignedByCondition(userId: String, variables: Map<String, Any?>): Long

    /**
     * 通过用户标识(实际参与者)，分页查询历史任务列表
     *
     * @param userId 用户标识.
     * @param start
     * @param limit
     * @return List<Task>  历史流程任务列表.
    </Task> */
    fun taskAssigneeHistory(userId: String, start: Int, limit: Int): List<HistoricTaskInstance>

    /**
     * 分页查询活动任务列表
     *
     * @param assignee 用户标识（实际参与者）.
     * @param query    编程方式查询对象.
     * @return 活动任务数量.
     */
    fun countTaskAssigneeByTaskQuery(assignee: String, query: TaskQuery): Long

    /**
     * 分页查询活动任务列表
     *
     * @param assignee 用户标识（实际参与者）.
     * @param query    编程方式查询对象.
     * @param start
     * @param limit
     * @return List<Task>  历史流程任务列表.
    </Task> */
    fun taskAssigneeByTaskQuery(assignee: String, query: TaskQuery, start: Int, limit: Int): List<Task>
}